package com.estacionamientos

import grails.plugins.springsecurity.Secured;
import net.sf.ehcache.Cache
import net.sf.ehcache.CacheManager
import net.sf.ehcache.Element
import org.hibernate.Criteria
import org.springframework.flex.remoting.RemotingDestination
import org.springframework.flex.remoting.RemotingInclude

import com.estacionamientos.busqueda.Busqueda
import com.estacionamientos.dto.EstacionamientoDTO
import com.estacionamientos.dto.EstacionamientoSimpleDTO


@RemotingDestination
class EstacionamientoService extends AbstractUsuarioService {

	def estacionamientoSimpleMapper;
	def estacionamientoMapper;
    static transactional = true
	def daoAuthenticationProvider
	def springSecurityService
	RolService rolService;
	
    public Estacionamiento saveObj(Estacionamiento obj){
		
		obj = super.saveMethod(obj);
		Rol rol = rolService.getEstacionamientoRol();
		AbstractUsuarioRol usuarioRol = new AbstractUsuarioRol("abstractUsuario":obj,"rol":rol);
		usuarioRol.save()
		return obj;
    }
    
    def listObj(){
       def g = [instanceList: Estacionamiento.list(), instanceTotal: Estacionamiento.count()]
       return g;
    }
	
	@RemotingInclude
	public List<EstacionamientoSimpleDTO> getAll(){
		
		CacheManager cacheManager = CacheManager.create()
		Cache cache = cacheManager.getCache("estacionamientos")
		
		if( cache.get('findAllEstacionamientos') == null ){
			List<Estacionamiento> listaEstacionamientos = Estacionamiento.findAll([cache:true])
			cache.put(new Element('findAllEstacionamientos', listaEstacionamientos))
		}
		List listaDto = estacionamientoSimpleMapper.mapList(cache.get('findAllEstacionamientos').getObjectValue())
		
		return listaDto
	}
	
	@RemotingInclude
	public EstacionamientoDTO getEstacionamiento(Long idEstacionamiento){
		Estacionamiento obj = Estacionamiento.get(idEstacionamiento,[cache:true])
		EstacionamientoDTO dto = estacionamientoMapper.toDto(obj)
		return dto
	}
	
	@RemotingInclude
	def buscarEstacionamientos(Busqueda busqueda){
		//return grailsApplication.mainContext.estacionamientoService.buscarEstacionamientosCacheada(busqueda);
		return busquedaDeEstacionamientos(busqueda)
	}
	
	def busquedaDeEstacionamientos(Busqueda busqueda){
		CacheManager cacheManager = CacheManager.create()
		Cache cache = cacheManager.getCache("estacionamientos")
		
		if( cache.get('findAllEstacionamientos') == null ){
			return buscarEstacionamientosCacheada(busqueda)
		}else{
			List lista = cache.get('findAllEstacionamientos').getObjectValue()
			List resultado = buscar(lista,busqueda)
			return resultado
		}

	}
	
	def buscar(List listaEstacionamientos, Busqueda busqueda){
		
		List resultado = new ArrayList()
		for (Estacionamiento e : listaEstacionamientos) {
			
			if(busqueda.getTechado()!=null){
				if(!e.getTechado().equals(busqueda.getTechado())){
					continue;
				}
			}else{
				break;
			}
			if(busqueda.getAtencion24Horas()!=null){
				if(!e.getAtencion24Horas().equals(busqueda.getAtencion24Horas())){
					continue;
				}
			}else{
				break;
			}
			if(busqueda.getPromocion()!=null){
				if(busqueda.getPromocion()&& e.getPromociones().isEmpty()){
					continue;
				}else if(!busqueda.getPromocion()&& !e.getPromociones().isEmpty()) {
					continue;
				}
			}else{
				break;
			}
	
			resultado.add(e)
		}
		return resultado;
	}
	
	def buscarEstacionamientosCacheada(Busqueda busqueda){
		StringBuffer sb = new StringBuffer()
		Map parametros = new HashMap()
		sb.append("from Estacionamiento as e where 1 = 1 ")
		
		if(busqueda.getTechado()!=null){
			sb.append("and e.techado = :techado ")
			parametros.put("techado", busqueda.getTechado())
		}
		if(busqueda.getAtencion24Horas()!=null){
			sb.append("and e.atencion24Horas = :atencion24Horas ")
			parametros.put("atencion24Horas", busqueda.getAtencion24Horas())
		}
		if(busqueda.getPromocion()!=null){
			if(busqueda.getPromocion()){
				sb.append("and e.promociones.size > 0 ")
			}else{
				sb.append("and e.promociones.size = 0 ")
			}
		}

		// en ves de ir a buscar a la base de datos, buscar en el cache.
		def listaEstacionamientos = Estacionamiento.findAll(sb.toString(),parametros,[cache:true])

		List listaDto = estacionamientoSimpleMapper.mapList(listaEstacionamientos)
		
		return listaDto;

	}
	
	def buscarEstacionamientosCacheada2(){
		
	}
	
    def getObj(String id){
        def instance = Estacionamiento.get(id)
        return instance
    }
    public void deleteObj(Estacionamiento obj){
        obj.delete(flush: true)

    }
	
	/**
	 * dummies
	 */
	public void crearEstacionamientosDummies(){
		Estacionamiento e1 = new Estacionamiento()
		guardarEstacionamientoDummie("userpepe","passwordpepe","cuitpepe","contactopepe","razonpepe",true);
		guardarEstacionamientoDummie("pepe1","pepe1","pepe1","pepe1","pepe1",true);
		guardarEstacionamientoDummie("pepe2","pepe2","pepe2","pepe2","pepe2",true);
		guardarEstacionamientoDummie("pepe3","pepe3","pepe3","pepe3","pepe3",true);
		guardarEstacionamientoDummie("pepe4","pepe4","pepe4","pepe4","pepe4",true);
		
	}
	
	private guardarEstacionamientoDummie(String username, String password,String cuit, String nombreContacto,String razonSocial, Boolean techado){
		Estacionamiento est = new Estacionamiento()
		
		est.setDireccion(new Direccion(direccion:"guardia Vieja 4288 4c").save())
		est.setUsername username
		est.setCuit cuit
		est.setPassword password
		est.setTechado techado
		est.setRazonSocial razonSocial
		est.setNombreContacto nombreContacto
		saveObj(est)
		
	}
	
	@Secured('ESTACIONAMIENTO_ROL')
	public Estacionamiento getLoggedEstacionamiento(){
		AbstractUsuario usuario = (AbstractUsuario) springSecurityService.getCurrentUser();
		return Estacionamiento.get(usuario.id);
	}
}
